package com.woniuxy.rms.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.woniuxy.rms.advice.LogPoint;
import com.woniuxy.rms.dto.MenusDTO;
import com.woniuxy.rms.pojo.Menus;
import com.woniuxy.rms.pojo.Permission;
import com.woniuxy.rms.service.MenuService;
import com.woniuxy.rms.service.PermissionService;
import com.woniuxy.rms.util.DataResult;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Auther: ChenGang  <br/>
 * Date: 2020/3/23 0023:下午 8:43  <br/>
 * Description:后台菜单控制层
 */
@Controller
@RequestMapping("/menus")
public class MenuController {

    @Autowired
    MenuService menuService;

    @Autowired
    PermissionService permissionService;
    /**
     * Description : 获取左侧菜单栏数据并封装  <br/>
     * ChangeLog : 1. 创建 (2020/3/23 0023 下午 8:43 [ChenGang]);
     *
     * @return java.util.List<com.woniuxy.rms.dto.MenusDTO>
    */
    @GetMapping("/getMenus")
    @ResponseBody
    @RequiresPermissions("menu:select")
    @LogPoint("获取菜单")
    public List<MenusDTO> getMenus(){
        List<MenusDTO> result = menuService.getMenusByRoleId();
        return result;
    }
    /**
     * 获取角色编辑页面默认选中的树形数据
     * @param roleId
     * @return
     */
    @GetMapping("/loadCheckTree")
    @ResponseBody
    public String loadCheckTree(Integer roleId){
        //通过角色id获取到菜单数据
        List<Menus> menusByRoles = menuService.findCheckMenusByRoles(roleId);
        //转成json格式字符串
        ObjectMapper mapper = new ObjectMapper();
        try {
            String treeRole = mapper.writeValueAsString(menusByRoles);
            return treeRole;
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * Description : 加载树形菜单  <br/>
     * ChangeLog : 1. 创建 (2020/3/24 0024 上午 10:16 [ChenGang]);
     *
     * @return java.lang.String
    */
    @GetMapping("/loadTreeMenus")
    @ResponseBody
    public String loadTreeMenus(){
        List<Menus> menus = menuService.findAll();
        //将集合转为json格式
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            String json = objectMapper.writeValueAsString(menus);
            return json;
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * Description : 菜单列表  <br/>
     * ChangeLog : 1. 创建 (2020/3/24 0024 上午 10:42 [ChenGang]);
     *
     * @return java.util.Map
    */
    @GetMapping("/list")
    @ResponseBody
    @LogPoint("查询菜单列表")
    @RequiresPermissions("menu:select")
    public Map MenuList(){
        List<Menus> menus = menuService.findAll();
        Map result = new HashMap();
        result.put("code",0);
        result.put("msg","success");
        result.put("data",menus);
        return result;
    }

    /**
     * 导航到添加页面
     * @param parentId
     * @return
     */
    @GetMapping("/addMenu/{parentId}")
    public ModelAndView addMenu(@PathVariable("parentId") Integer parentId){
        //查询权限信息
        List<Permission> perms = permissionService.findAll();
        ModelAndView modelAndView = new ModelAndView("/system/addMenu");
        modelAndView.addObject("parentId",parentId);
        modelAndView.addObject("perms",perms);
        return modelAndView;
    }
    /**
     * Description : 添加菜单  <br/>
     * ChangeLog : 1. 创建 (2020/3/24 0024 上午 10:44 [ChenGang]);
     * @param menus
     * @return com.woniuxy.rms.util.DataResult
    */
    @PostMapping("/save")
    @ResponseBody
    @LogPoint("添加菜单")
    @RequiresPermissions("menu:save")
    public DataResult save(Menus menus){
        DataResult result = menuService.saveMenu(menus);
        return result;
    }

    /**
     * Description : 删除菜单  <br/>
     * ChangeLog : 1. 创建 (2020/3/24 0024 上午 10:59 [ChenGang]);
     * @param id
     * @return com.woniuxy.rms.util.DataResult
    */
    @DeleteMapping("/delete")
    @ResponseBody
    @LogPoint("删除菜单")
    @RequiresPermissions("menu:delete")
    public DataResult delete(Integer id){
        menuService.deleteMenu(id);
        return DataResult.success();
    }
    /**
     * 导航到编辑页面
     * @param menuId
     * @return
     */
    @GetMapping("/editMenu/{menuId}")
    public ModelAndView editMenu(@PathVariable("menuId") Integer menuId){
        //获取到菜单数据
        Menus menu = menuService.findById(menuId);
        //查询权限信息
        List<Permission> perms = permissionService.findAll();
        ModelAndView modelAndView = new ModelAndView("/system/editMenu");
        modelAndView.addObject("menu",menu);
        modelAndView.addObject("perms",perms);
        return modelAndView;
    }
    /**
     * Description : 更新菜单  <br/>
     * ChangeLog : 1. 创建 (2020/3/24 0024 上午 11:02 [ChenGang]);
     * @param menus
     * @return com.woniuxy.rms.util.DataResult
    */
    @PutMapping("/update")
    @ResponseBody
    @RequiresPermissions("menu:update")
    @LogPoint("更新菜单")
    public DataResult update(Menus menus){
        DataResult result = menuService.updateMenu(menus);
        return result;
    }
}